Librerías

library(tidyverse)
library(data.table)
library(readxl)
library(GGally)
library(leaflet)
library(raster)
library(mltools)
library(corrplot)
library(highcharter)

Lectura de datos

Inicialmente, para la lectura de datos, se requieren unos cambios en los nombres de las variables para graficar los mapas posteriormente.

raw_encuesta <- fread("databases/calidad_vida_ok.csv", encoding = "UTF-8") %>% 
  as_tibble()

# Unificación de las estadísticas de los barrios "ALTAVISTA" y "CABECERA ALTAVISTA"

raw_encuesta <- raw_encuesta %>% mutate(
  encuesta_calidad.barrio = case_when(
    encuesta_calidad.barrio == "CABECERA ALTAVISTA" ~ "ALTAVISTA",
    encuesta_calidad.barrio == "CIUDADELA NUEVO OCCIDENTE" ~ "CABECERA URBANA CORREGIMIENTO SAN CRISTÓBAL",
    encuesta_calidad.barrio == "AREA DE EXPANCION SAN CRISTOBAL" ~ "ÁREA DE EXPANSIÓN SAN CRISTÓBAL",
    encuesta_calidad.barrio == "CABECERA SAN CRISTÓBAL" ~ "CABECERA URBANA CORREGIMIENTO SAN CRISTÓBAL",
    encuesta_calidad.barrio == "SAN CRISTOBAL" ~ "CABECERA URBANA CORREGIMIENTO SAN CRISTÓBAL",
    encuesta_calidad.barrio == "PROGRESO  Nº 2" ~ "PROGRESO",
    TRUE ~ encuesta_calidad.barrio
  )
)

# One-hot encoding para variable estudio

variables_categoricas <- raw_encuesta[, c("encuesta_calidad.p_45")] %>% mutate(
  encuesta_calidad.p_45 = as.factor(encuesta_calidad.p_45)
) %>% rename(
  nivel_estudio = encuesta_calidad.p_45 
)

variables_categoricas_encoding <- one_hot(as.data.table(variables_categoricas))

raw_encuesta <- data.frame(raw_encuesta, variables_categoricas_encoding)

Creación de la base de datos

La creación de la base de datos se hace con base en las preguntas pertenecientes a la dimensión “Escolaridad”, esta clasificación de las preguntas se hizo a criterio del equipo con la ayuda del informe escrito por la Alcaldía de Medellín durante el planteamiento de la encuesta.

#Agregación de las variables

db_escolaridad <- raw_encuesta %>% 
  mutate(encuesta_calidad.barrio = str_replace(encuesta_calidad.barrio, "ANDALUCIA", "ANDALUCÍA") %>% 
  str_replace("Nº 2", "NO.2") %>% 
  str_replace("Nº 1", "NO.1") %>% 
  str_replace("Nº 3", "NO.3") %>%
  str_replace("AREA EXPANSION", "ÁREA DE EXPANSIÓN") %>%
  str_replace("EXPANCION", "EXPANSIÓN") %>% 
  str_replace("AREA", "ÁREA") %>% 
  str_replace("BOMBONA", "BOMBONÁ") %>% 
  str_replace("LA ASOMADERA", "ASOMADERA") %>%
  str_replace("BELALCAZAR", "BELALCÁZAR") %>% 
  str_replace("CALAZANS", "CALASANZ") %>% 
  str_replace("COLON", "COLÓN") %>% 
  str_replace("MIRA FLORES", "MIRAFLORES") %>% 
  str_replace("BARRIO FACULTAD DE MINAS", "FACULTAD DE MINAS") %>% 
  str_replace("CABECERA SAN ANT DE PR.", "SAN ANTONIO DE PRADO") %>% 
  str_replace("CARLOS E RESTREPO", "CARLOS E. RESTREPO") %>% 
  str_replace("URQUITA", "URQUITÁ") %>% 
  str_replace("LOS CERROS EL VERJEL", "LOS CERROS EL VERGEL") %>% 
  str_replace("CAYCEDO", "CAICEDO") %>% 
  str_replace("VALDES", "VALDÉS") %>% 
  str_replace("CERRO EL VOLADOR", "B. CERRO EL VOLADOR") %>% 
  str_replace("MOSCU", "MOSCÚ") %>% 
  str_replace("JOSELA", "JOSÉ LA") %>%
  str_replace("JOSE", "JOSÉ") %>% 
  str_replace("EL YOLOMBO", "YOLOMBO") %>% 
  str_replace("PIEDRAS BLANCAS", "PIEDRAS BLANCAS - MATASANO") %>% 
  str_replace("BASILIA", "BRASILIA") %>% 
  str_replace("VILLA TINA", "VILLATINA") %>% 
  str_replace("LILIAM", "LILLIAM") %>% 
  str_replace("BOLIVAR", "BOLÍVAR") %>% 
  str_replace("CORREGIMIENTO PALMITAS", "PALMITAS SECTOR CENTRAL") %>% 
  str_replace("INES", "INÉS") %>% 
  str_replace("FE", "FÉ") %>% 
  str_replace("LUCIA", "LUCÍA") %>% 
  str_replace("SABIO", "SAVIO") %>% 
  str_replace("BERMEJAL- LOS ÁLAMOS", "BERMEJAL-LOS ÁLAMOS") %>% 
  str_replace("BOLÍVARIANA", "BOLIVARIANA") %>% 
  str_replace("EL NOGAL - LOS ALMENDROS", "EL NOGAL-LOS ALMENDROS") %>% 
  str_replace("JUAN XXIII - LA QUIEBRA", "JUAN XXIII LA QUIEBRA") %>% 
  str_replace("PROGRESO  Nº 2", "EL PROGRESO") %>% 
  str_replace("MARIA", "MARÍA") %>% 
  str_replace("PLAYÓN", "PLAYON") %>% 
  str_replace("EL SOCORRO / LA GABRIELA", "EL SOCORRO") %>% 
  str_replace("FÉRRINI", "FERRINI") %>% 
  str_replace("LA CANDE LARIA", "LA CANDELARIA") %>%
  str_replace("EL PLAYON", "PLAYÓN") %>%
  str_replace("IGUANA", "IGUANÁ") %>%
  str_replace("MARÍA CANO - CARAMBOLAS", "MARÍA CANO-CARAMBOLAS") %>%
  str_replace("DE ABURRA", "DEL ABURRÁ") %>%
  str_replace("ALTAVISTA CENTRAL", "ALTAVISTA SECTOR CENTRAL") %>%
  str_replace("SECTOR CENTRAL", "CENTRO ADMINISTRATIVO") %>%
  str_replace("ALTAVISTA CENTRO ADMINISTRATIVO", "ALTAVISTA SECTOR CENTRAL") %>%
  str_replace("SANTA ELENA CENTRO ADMINISTRATIVO", "SANTA ELENA SECTOR CENTRAL") %>%
  str_replace("PALMITAS CENTRO ADMINISTRATIVO", "PALMITAS SECTOR CENTRAL") %>%  
  str_replace("PROGRESO", "EL PROGRESO")
  ) %>% 
  group_by(encuesta_calidad.barrio, encuesta_calidad.comuna) %>% 
  summarize(n = n(), edad_promedio = mean(`encuesta_calidad.p_18`, na.rm = TRUE),
            proporcion_lectoescritura = sum(`encuesta_calidad.p_35` == 1, na.rm = TRUE) / sum(!is.na(`encuesta_calidad.p_35`), na.rm = TRUE),
            proporcion_escolaridad_actual = sum(`encuesta_calidad.p_36` == 1, na.rm = TRUE) / sum(!is.na(`encuesta_calidad.p_36`), na.rm = TRUE),
            estudio_ultimo_ano = sum(`encuesta_calidad.p_37` == 1, na.rm = TRUE) / sum(!is.na(`encuesta_calidad.p_37`), na.rm = TRUE),
            proporcion_instituciones_publicas = sum(`encuesta_calidad.p_49` == 1, na.rm = TRUE) / sum(!is.na(`encuesta_calidad.p_49`), na.rm = TRUE),
            proporcion_nivel_estudio_0 = sum(`nivel_estudio_0` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_0`), na.rm = TRUE),
            proporcion_nivel_estudio_1 = sum(`nivel_estudio_1` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_1`), na.rm = TRUE),
            proporcion_nivel_estudio_2 = sum(`nivel_estudio_2` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_2`), na.rm = TRUE),
            proporcion_nivel_estudio_3 = sum(`nivel_estudio_3` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_3`), na.rm = TRUE),
            proporcion_nivel_estudio_4 = sum(`nivel_estudio_4` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_4`), na.rm = TRUE),
            proporcion_nivel_estudio_5 = sum(`nivel_estudio_5` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_5`), na.rm = TRUE),
            proporcion_nivel_estudio_6 = sum(`nivel_estudio_6` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_6`), na.rm = TRUE),
            proporcion_nivel_estudio_7 = sum(`nivel_estudio_7` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_7`), na.rm = TRUE),
            proporcion_nivel_estudio_8 = sum(`nivel_estudio_8` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_8`), na.rm = TRUE),
            proporcion_nivel_estudio_9 = sum(`nivel_estudio_9` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_9`), na.rm = TRUE),
            proporcion_nivel_estudio_10 = sum(`nivel_estudio_10` == 1, na.rm = TRUE) / sum(!is.na(`nivel_estudio_10`), na.rm = TRUE)
          ) %>% as_tibble()

# Eliminamos el barrio desconocido

db_escolaridad <- db_escolaridad %>% 
  filter(encuesta_calidad.barrio != "DESCONOCIDO")

Escritura de los datos

write_excel_csv2(db_escolaridad, "databases/db_escolaridad.csv")

Descripcion de las variables seleccionadas

Es importante considerar que la variable “edad_promedio” no necesariamente hace referencia a la dimensión de escolaridad, sin embargo, se quiere realizar un contraste entre la variable “edad_promedio” y las demás variables para extraer información y hacer validaciones empíricas.

Analisis preliminar de los datos

Medias, cuartiles y desviaciones estándar

summary(db_escolaridad)
##  encuesta_calidad.barrio encuesta_calidad.comuna       n         
##  Length:308              Length:308              Min.   :   4.0  
##  Class :character        Class :character        1st Qu.: 348.8  
##  Mode  :character        Mode  :character        Median : 862.5  
##                                                  Mean   :1073.2  
##                                                  3rd Qu.:1439.0  
##                                                  Max.   :8987.0  
##  edad_promedio   proporcion_lectoescritura proporcion_escolaridad_actual
##  Min.   :23.00   Min.   :0.6667            Min.   :0.1000               
##  1st Qu.:32.98   1st Qu.:0.8809            1st Qu.:0.2383               
##  Median :36.20   Median :0.9125            Median :0.2638               
##  Mean   :36.88   Mean   :0.9079            Mean   :0.2623               
##  3rd Qu.:40.69   3rd Qu.:0.9421            3rd Qu.:0.2889               
##  Max.   :58.25   Max.   :1.0000            Max.   :0.5000               
##  estudio_ultimo_ano proporcion_instituciones_publicas
##  Min.   :0.00000    Min.   :0.2222                   
##  1st Qu.:0.01565    1st Qu.:0.7326                   
##  Median :0.02206    Median :0.8948                   
##  Mean   :0.02290    Mean   :0.8169                   
##  3rd Qu.:0.02843    3rd Qu.:0.9442                   
##  Max.   :0.11111    Max.   :1.0000                   
##  proporcion_nivel_estudio_0 proporcion_nivel_estudio_1
##  Min.   :0.00000            Min.   :0.00000           
##  1st Qu.:0.07585            1st Qu.:0.06916           
##  Median :0.12006            Median :0.11016           
##  Mean   :0.12759            Mean   :0.11103           
##  3rd Qu.:0.16647            3rd Qu.:0.14499           
##  Max.   :0.45455            Max.   :0.25397           
##  proporcion_nivel_estudio_2 proporcion_nivel_estudio_3
##  Min.   :0.05263            Min.   :0.00000           
##  1st Qu.:0.19048            1st Qu.:0.06058           
##  Median :0.25095            Median :0.07895           
##  Mean   :0.23695            Mean   :0.07716           
##  3rd Qu.:0.28760            3rd Qu.:0.09458           
##  Max.   :0.52381            Max.   :0.25000           
##  proporcion_nivel_estudio_4 proporcion_nivel_estudio_5
##  Min.   :0.09091            Min.   :0.00000           
##  1st Qu.:0.20988            1st Qu.:0.03508           
##  Median :0.24640            Median :0.04964           
##  Mean   :0.24372            Mean   :0.04925           
##  3rd Qu.:0.27755            3rd Qu.:0.06209           
##  Max.   :0.50000            Max.   :0.13333           
##  proporcion_nivel_estudio_6 proporcion_nivel_estudio_7
##  Min.   :0.00000            Min.   :0.00000           
##  1st Qu.:0.01568            1st Qu.:0.02220           
##  Median :0.03062            Median :0.05376           
##  Mean   :0.03364            Mean   :0.09698           
##  3rd Qu.:0.04996            3rd Qu.:0.14323           
##  Max.   :0.11111            Max.   :0.36842           
##  proporcion_nivel_estudio_8 proporcion_nivel_estudio_9
##  Min.   :0.0000000          Min.   :0.0000000         
##  1st Qu.:0.0004705          1st Qu.:0.0000000         
##  Median :0.0041754          Median :0.0009129         
##  Mean   :0.0161616          Mean   :0.0061769         
##  3rd Qu.:0.0198397          3rd Qu.:0.0064606         
##  Max.   :0.1225364          Max.   :0.0727763         
##  proporcion_nivel_estudio_10
##  Min.   :0.000000           
##  1st Qu.:0.000000           
##  Median :0.000000           
##  Mean   :0.001348           
##  3rd Qu.:0.001084           
##  Max.   :0.024691

Desviaciones estándar

db_escolaridad %>% select_if(is.numeric) %>% 
  apply(2, sd)
##                                 n                     edad_promedio 
##                      1.019528e+03                      5.418267e+00 
##         proporcion_lectoescritura     proporcion_escolaridad_actual 
##                      4.521456e-02                      4.694050e-02 
##                estudio_ultimo_ano proporcion_instituciones_publicas 
##                      1.343127e-02                      1.811589e-01 
##        proporcion_nivel_estudio_0        proporcion_nivel_estudio_1 
##                      6.288825e-02                      5.129729e-02 
##        proporcion_nivel_estudio_2        proporcion_nivel_estudio_3 
##                      7.227418e-02                      2.751268e-02 
##        proporcion_nivel_estudio_4        proporcion_nivel_estudio_5 
##                      4.962019e-02                      2.082606e-02 
##        proporcion_nivel_estudio_6        proporcion_nivel_estudio_7 
##                      2.218821e-02                      9.975298e-02 
##        proporcion_nivel_estudio_8        proporcion_nivel_estudio_9 
##                      2.558032e-02                      1.158639e-02 
##       proporcion_nivel_estudio_10 
##                      3.221845e-03

Dada la información sobre las medias arrojada para cada variable, hay que resaltar que la proporción de personas con habilidades lecto-escritoras es alta con un 0.907902, la cual es una cifra positiva pues muestra que en la población no hay analfabetismo crítico.

Por otro lado, las proporción de personas que estudiaron en el último año tambien es baja, pero no se debe concluir que esto es necesariamente negativo. Cabe la posibilidad que varias personas en un determinado barrio sean trabajadores y por tanto no dedican mas tiempo al estudio a partir de cierto momento de su vida.

Gráficas

Correlaciones y análisis de distribuciones

Ahora centremos nuestra atención en variables específicas del conjunto de datos.

ggpairs(data = db_escolaridad %>% dplyr::select(edad_promedio, proporcion_escolaridad_actual, proporcion_lectoescritura),
       mapping = aes(alpha = 0.7))

De la gráfica anterior, se debe resaltar significativamente las correlaciones entre las variables “edad_promedio” con las variables “proporcion_lectoescritura” y “proporcion_escolaridad_actual”. Note que la “edad_promedio” esta correlacionada de manera directa con la variable “proporcion_lectoescritura” y de manera inversa con la variable “proporcion_escolaridad_actual”. Esta información que se obtiene coincide con el conocimiento epírico, pues por un lado, las personas con mayor edad tienen mas probabilidad de tener como mínimo educación primaria, obteniendo así mas habilidades lecto-escritoras, mientras que por otro lado a medida que las personas envejecen dejan de educarse debido a que pasan al entorno laboral.

ggplot(data = db_escolaridad,
       mapping = aes(x = proporcion_instituciones_publicas)) +
  geom_density()

Por otro lado, analizando la gráfica anterior, se puede notar que en los barrios, las personas tienen tendencia a educarse en establecimientos de índole pública debido a su fácil acceso.

Ahora centraremos nuestro análisis en la proporcion de personas cuyo último nivel de estudio fue primaria, secundaria y universidad. A continuación interpretaremos la relación entre estas proporciones y el tipo de institución pública donde se realizó el último estudio.

ggpairs(data = db_escolaridad %>% 
          dplyr::select(proporcion_instituciones_publicas,
                        proporcion_nivel_estudio_7),
       mapping = aes(alpha = 0.7))

En la gráfica anterior se puede ver un hallazgo importante, y es que en los barrios donde las personas tienden a estudiar en instituciones públicas, hay una menor tendencia a optar por estudios universitarios, mientras que los barrios que tienen tendencia a realizar estudios en instituciones privadas, tienen mayor proporción de personas que optan tener estudios universitarios. Este fenómeno puede analizarse desde una perspectiva transversal a la condicion económica de los barrios, pues si en un barrio hay más tendencia a educarse en instituciones privadas, significa que hay un poder adquisitivo mucho más alto, lo que permite tener oportunidades económicas para realizar estudios universitarios; mientras que por otro lado, el acceso a la educación pública para estudios escolares es económicamente mas viable, por tanto en los barrios con bajos ingresos la educación primaria y secundaria se puede adquirir con facilidad, pero ingresar a instituciones de educación superior es mucho más retador, pues las universidades privadas no son una opción común debido a las dificultades económicas, y sumado a esto la educación superior pública tiene mecanismos de selección para estudiantes aspirantes, lo cual reduce la posibilidad de ingresar a la educación universitaria en estos barrios.

Ahora si tomamos las proporciones de los niveles de estudio y extraemos la media puede tenerse una visión general de la escolaridad en Medellín.

medias_nivel_estudio <- apply(db_escolaridad %>% dplyr::select( proporcion_nivel_estudio_0, 
                        proporcion_nivel_estudio_1,
                        proporcion_nivel_estudio_2,
                        proporcion_nivel_estudio_3,
                        proporcion_nivel_estudio_4,
                        proporcion_nivel_estudio_5,
                        proporcion_nivel_estudio_6,
                        proporcion_nivel_estudio_7,
                        proporcion_nivel_estudio_8,
                        proporcion_nivel_estudio_9,
                        proporcion_nivel_estudio_10), 2, mean)

ggplot(data = data.frame(nivel_estudio = factor(0:10), medias_nivel_estudio)) +
  geom_bar(mapping = aes(x = nivel_estudio, weight = medias_nivel_estudio))

Note entonces que las personas de los barrios tienden a tener estudios de secundaria y media técnica como último estudio realizado, mientras que los estudios universitarios tienen una proporcion media muy baja respecto a los demas niveles de estudio.

Escalamiento de datos

Inicialmente escalaremos las variables que se usaran en los algoritmos de agrupamiento.

db_escolaridad_escalado <- db_escolaridad %>% 
  mutate_at(vars(-n, -encuesta_calidad.barrio, -encuesta_calidad.comuna), scale)

# Selección de las columnas para el agrupamiento

datos_escalados_agrupamiento <- db_escolaridad_escalado %>% 
  dplyr::select(-n, -encuesta_calidad.barrio, -encuesta_calidad.comuna)

Aplicación de PCA

pca <- prcomp(datos_escalados_agrupamiento)
summary(pca)
## Importance of components:
##                          PC1    PC2     PC3     PC4     PC5     PC6
## Standard deviation     2.840 1.4951 1.10595 0.96429 0.94599 0.76194
## Proportion of Variance 0.504 0.1397 0.07645 0.05812 0.05593 0.03628
## Cumulative Proportion  0.504 0.6437 0.72012 0.77824 0.83417 0.87045
##                            PC7     PC8     PC9    PC10    PC11    PC12
## Standard deviation     0.73055 0.63054 0.54745 0.49933 0.45841 0.41797
## Proportion of Variance 0.03336 0.02485 0.01873 0.01558 0.01313 0.01092
## Cumulative Proportion  0.90381 0.92866 0.94739 0.96297 0.97611 0.98703
##                           PC13    PC14    PC15      PC16
## Standard deviation     0.31929 0.23779 0.22158 2.654e-16
## Proportion of Variance 0.00637 0.00353 0.00307 0.000e+00
## Cumulative Proportion  0.99340 0.99693 1.00000 1.000e+00

Varianza explicada por cada componente

Ahora, se mostrará la varianza explicada por los componentes mediante el calculo de la suma acumulada del porcentaje explicado.

porcentaje_exp <- 100 * (pca$sdev ^ 2) / sum(pca$sdev ^ 2)
suma_acumulada_porcentaje <- cumsum(porcentaje_exp)

ggplot(data = data.frame(componente = factor(1:ncol(datos_escalados_agrupamiento)), suma_acumulada_porcentaje),
        aes(x = componente, y = suma_acumulada_porcentaje, group = 1)) +
  geom_point() +
  geom_line() +
  geom_hline(yintercept = 90, color = "red") +
  geom_vline(xintercept = 7)

En la gráfica anterior, la linea horizontal roja corresponde a una varianza explicada acumulada de un 90%, por tanto se puede ver que al tomar las primeras 7 componentes principales se obtiene una varianza explicada de 90.3809835%, lo cuál se usará para hacer la reducción de dimensionalidad.

Proyección respecto a las componentes principales

Primero proyectaremos los datos respecto a las componentes principales.

datos_proyectados <- t(t(pca$rotation) %*% t(datos_escalados_agrupamiento))

Ahora seleccionaremos las primeras 7 componentes principales que explican mas del 90% de la varianza.

datos_agrupamiento <- datos_proyectados[, 1:7] %>% as_tibble()

Agrupamiento mediante K-means

El primer método que se usara para hacer el agrupamiento sera K-means. Para esto, realizaremos una gráfica de codo que nos dará indicios del número de grupos que debemos tomar dentro de este algoritmo.

Selección del \(K\) óptimo (Gráfica de codo)

k_maximo <- 15

wss <- sapply(1:k_maximo, 
              function(k) {
                kmeans(datos_agrupamiento, k, nstart = 10, iter.max = 15 )$tot.withinss
              })


ggplot(data = data.frame(k = factor(1:k_maximo), wss),
        aes(x = k, y = wss, group = 1)) +
  geom_point() +
  geom_line() +
  xlab("Número de grupos [K]") +
  ylab("Total de suma de cuadrados intra-grupos")

k_optimo_kmeans <- 5

Note entonces que una selección de \(K\) entre 5 y 7 es razonable, ya que la variación de la suma de cuadrados intra-grupos no ofrece un cambio significativo. Además se considera contraproducente hacer una selección muy grande de grupos en términos de la interpretabilidad del resultado ofrecido por el algoritmo de agrupamiento, pues se considera mas util tener pocos grupos que sean altamente diferenciadores de la ciudad de Medellín contrario a tener una variedad de grupos altamente dispersos donde no se pueda identificar un patrón de agrupamiento claro.

Agrupamiento con \(K\) óptimo

Se realiza la ejecución del algoritmo K-means con la cantidad de grupos extraidas del análisis anterior.

agrupamiento_kmeans <- kmeans(datos_agrupamiento, centers = k_optimo_kmeans, nstart = 10, iter.max = 15 )

Mapa para el agrupamiento mediante K-means

Al colorear el mapa de los barrios de Medellín de acuerdo a los grupos se obtiene la siguiente gráfica.

political <- shapefile("Barrio_Vereda/Barrio_Vereda.shp")
Encoding(political@data$NOMBRE) <- "UTF-8"
political$NOMBRE <- political$NOMBRE %>% toupper() %>% str_replace("DE  MESA", "DE MESA")

grupos_barrios <- data.frame(barrio_nombre = db_escolaridad$encuesta_calidad.barrio, comuna_nombre = db_escolaridad$encuesta_calidad.comuna, grupo = agrupamiento_kmeans$cluster)
nombres_mapa <- data.frame(nombre_barrio = political$NOMBRE)

vector_nombres = c()
vector_grupos = c()

for(nombre_mapa in nombres_mapa$nombre_barrio) {
  grupo <- grupos_barrios[grupos_barrios$barrio_nombre == nombre_mapa, 3][1]
  vector_nombres <- c(vector_nombres, nombre_mapa)
  vector_grupos <- c(vector_grupos, grupo)
}

mapa_grupos <- data.frame(
  nombre_barrio = vector_nombres, 
  grupo = vector_grupos
)

factpal <- colorFactor(rainbow(k_optimo_kmeans), mapa_grupos$grupo)

leaflet(data = political) %>% 
  addTiles() %>% 
  addProviderTiles(providers$OpenStreetMap) %>% 
  addPolygons(fill = TRUE, stroke = TRUE, weight = 2, color = ~factpal(mapa_grupos$grupo), 
              label = as.character(paste(political$NOMBRE, " - Grupo ", mapa_grupos$grupo)),
              popup = as.character(paste(political$NOMBRE, " - Grupo ", mapa_grupos$grupo))) %>% 
  addLegend("bottomright", colors = "#03F", labels = "Barrios y veredas")

Análisis del agrupamiento

db_escolaridad_kmeans <- db_escolaridad %>% mutate(
  grupo = factor(agrupamiento_kmeans$cluster)
)

Cálculo de la media y la varianza por grupos

medias_grupo_kmeans <- db_escolaridad_kmeans %>% dplyr::select(-n, -encuesta_calidad.barrio, -encuesta_calidad.comuna) %>% 
  group_by(grupo) %>% 
  summarize_all(~mean(.))

Primero, analicemos la media de la variable que mide la proporción de personas con habilidades lecto-escritoras

ggplot(data = medias_grupo_kmeans) +
  geom_bar(mapping = aes(x = grupo, weight = proporcion_lectoescritura))

Hay que notar que la proporción de personas con la capacidad de leer y escribir mas de un párrafo no es una característica diferenciadora a la hora de hacer el agrupamiento. Esto se puede concluir a partir de los resultados obtenidos en el análisis descriptivo, pues las habilidad lecto-escritora media es buena en la mayor parte de la ciudad.

Un criterio que será diferenciador entre los grupos será la proporción de personas cuyo último nivel de estudio es universitario, pues en general el análisis descriptivo arrojó que esta proporción es baja al analizar los barrios desde un punto de vista general. Veamos una gráfica comparativa por grupos para esta variable.

ggplot(data = medias_grupo_kmeans) +
  geom_bar(mapping = aes(x = grupo, weight = proporcion_nivel_estudio_7))

grupo_mayor_universitarios <- medias_grupo_kmeans[which(medias_grupo_kmeans$proporcion_nivel_estudio_7 == max(medias_grupo_kmeans$proporcion_nivel_estudio_7)), "grupo"]$grupo

grupo_menor_universitarios <- medias_grupo_kmeans[which(medias_grupo_kmeans$proporcion_nivel_estudio_7 == min(medias_grupo_kmeans$proporcion_nivel_estudio_7)), "grupo"]$grupo

El grupo donde predominan las personas que realizan estudios universitarios como último estudio es 2, mientras que el grupo donde la proporción de habitantes cuyo ultmo estudio es de caracter universitario es mas pequeña corresponde al grupo 3 .

El grupo 2 corresponde a los siguientes barrios que aparecen en este color dentro del mapa:

db_escolaridad_kmeans[which(db_escolaridad_kmeans$grupo == grupo_mayor_universitarios), "encuesta_calidad.barrio"] %>% as.list()
## $encuesta_calidad.barrio
##  [1] "ALEJANDRÍA"                 "ALTOS DEL POBLADO"         
##  [3] "ASTORGA"                    "CASTROPOL"                 
##  [5] "EL CASTILLO"                "EL DIAMANTE NO.2"          
##  [7] "EL POBLADO"                 "EL TESORO"                 
##  [9] "LA AGUACATALA"              "LA FLORIDA"                
## [11] "LALINDE"                    "LAS LOMAS NO.1"            
## [13] "LAS LOMAS NO.2"             "LOS BALSOS NO.1"           
## [15] "LOS BALSOS NO.2"            "LOS CONQUISTADORES"        
## [17] "LOS NARANJOS"               "SAN LUCAS"                 
## [19] "SANTA MARÍA DE LOS ÁNGELES" "SURAMERICANA"              
## [21] "VILLA CARLOTA"

Por otro lado el grupo 3, que es el grupo con menor indicador de personas con estudios universitarios corresponde a los siguientes barrios que se encuentran coloreados con este color dentro del mapa:

db_escolaridad_kmeans[which(db_escolaridad_kmeans$grupo == grupo_menor_universitarios), "encuesta_calidad.barrio"] %>% as.list()
## $encuesta_calidad.barrio
##  [1] "AGUAS FRÍAS"                "ALDEA PABLO VI"            
##  [3] "ALTAVISTA"                  "ALTAVISTA SECTOR CENTRAL"  
##  [5] "BATALLÓN GIRARDOT"          "BLANQUIZAL"                
##  [7] "BUGA PATIO BONITO"          "CARPINELO"                 
##  [9] "EL ASTILLERO"               "EL COMPROMISO"             
## [11] "EL CORAZÓN EL MORRO"        "EL JARDÍN"                 
## [13] "EL LLANO"                   "EL PICACHO"                
## [15] "EL RAIZAL"                  "EL TRIUNFO"                
## [17] "EL UVITO"                   "FUENTE CLARA"              
## [19] "GRANIZAL"                   "JUAN PABLO II"             
## [21] "JUAN XXIII LA QUIEBRA"      "LA ALDEA"                  
## [23] "LA AVANZADA"                "LA CRUZ"                   
## [25] "LA CUCHILLA"                "LA ESPERANZA"              
## [27] "LA ESPERANZA NO.2"          "LA FRONTERA"               
## [29] "LA ILUSIÓN"                 "LA ISLA"                   
## [31] "LA LIBERTAD"                "LA LOMA"                   
## [33] "LA PALMA"                   "LA ROSA"                   
## [35] "LA SALLE"                   "LA SIERRA"                 
## [37] "LA SUCIA"                   "LA SUIZA"                  
## [39] "LA VERDE"                   "LAS ESTANCIAS"             
## [41] "LAS INDEPENDENCIAS"         "LLANADITAS"                
## [43] "MARÍA CANO-CARAMBOLAS"      "MIRADOR DEL DOCE"          
## [45] "MORAVIA"                    "MOSCÚ NO.1"                
## [47] "MOSCÚ NO.2"                 "NARANJAL"                  
## [49] "NUEVOS CONQUISTADORES"      "OCHO DE MARZO"             
## [51] "OLAYA HERRERA"              "ORIENTE"                   
## [53] "PAJARITO"                   "PALMITAS SECTOR CENTRAL"   
## [55] "PICACHITO"                  "PICACHO"                   
## [57] "PIEDRAS BLANCAS - MATASANO" "PLAYÓN DE LOS COMUNEROS"   
## [59] "POPULAR"                    "POTRERA MISERENGA"         
## [61] "SAN ANTONIO"                "SAN JOSÉ DE LA MONTAÑA"    
## [63] "SAN JOSÉ DEL MANZANILLO"    "SAN JOSÉ LA CIMA NO.2"     
## [65] "SAN PABLO"                  "SAN PABLO"                 
## [67] "SANTA CRUZ"                 "SANTA INÉS"                
## [69] "SANTA MARGARITA"            "SANTANDER"                 
## [71] "SANTO DOMINGO SAVIO NO.1"   "SANTO DOMINGO SAVIO NO.2"  
## [73] "TRAVESÍAS"                  "TRECE DE NOVIEMBRE"        
## [75] "URQUITÁ"                    "VERSALLES NO.2"            
## [77] "VILLA DEL SOCORRO"          "VILLA GUADALUPE"           
## [79] "VILLA LILLIAM"              "VILLA NIZA"                
## [81] "VILLA TURBAY"               "VILLATINA"

Es importante notar entonces que los barrios con personas que acceden a estudios universitarios se situan en en suroriente de la ciudad, y algunos de ellos también estan ubicados en la parte central. Pero hay que aclarar que una característica general de estos barrios es que son mas cercanos a la cabecera urbana de Medellín. Adicionalmente, acudiendo a la experiencia, estos barrios son lugar de residencia de personas con mayor capacidad económica, mientras que los barrios con un menor indice de personas que tienen estudios universitarios corresponde a aquellos ubicados en zonas geográficas alejadas del centro de la ciudad y son reconocidos por ser barrios de bajos ingresos económicos. Este resultado puede darse debido a que las instituciones universitarias públicas estan ubicados en la parte central de la ciudad y unido a esto, dichas universidades realizan procesos de selección para el ingreso de nuevos aspirantes, por tanto, los barrios marginales tienen dificultades para acceder a este tipo de educación por su ubicación geografica y por su incapacidad económica para que sus habitantes asistan a dichas instituciones.

Realicemos este mismo análisis usando la proporcion de personas cuyo ultimo estudio lo realizaron en instituciones de educación pública, y veamos que esto refuerza el argumento que fue expuesto anteriormente.

ggplot(data = medias_grupo_kmeans) +
  geom_bar(mapping = aes(x = grupo, weight = proporcion_instituciones_publicas))

Note entonces que el fenómeno donde la economía de los hogares incide en las alternativas de selección para la educación se marca también se ve expresado en los grupos de barrios discutidos anteriormente. Pues se puede notar que las personas que viven en barrios reconocidos por tener dificultades económicas realizan su ultimo estudio en instituciones de educación pública debido al facil acceso a este tipo de educación.

Este fenómeno es un motivante para centrar la atención en la creación de políticas donde las personas de los barrios ubicados en el grupo 3 tengan acceso a estudios universitarios con el fin de mejorar su calidad educativa y ayudar a sus habitantes a mejorar sus condiciones de vida en las demas dimensiones.

Un caso interesante de análisis, es considerar a los barrios aledaños a San Antonio de Prado, si bien es cierto que estos barrios estan alejados de la parte central de la ciudad, no aparecen dentro del grupo 3. Pero si observamos la geografía de este barrio, notamos que hay vías de acceso hacia el municipio de Itagui, la Estrella y Sabaneta, lo que mejora en cierta medida la calidad educativa de esta zona.

Si se intenta generalizar este análisis y mostramos los grupos ordenados de manera descendente de acuerdo a la media de la proporcionalidad de personas cuyo último nivel de estudio es universitario, se obtiene los siguientes datos:

medias_grupo_kmeans[order(medias_grupo_kmeans$proporcion_nivel_estudio_7, decreasing = TRUE), ] %>% dplyr::select(grupo, proporcion_nivel_estudio_7)
## # A tibble: 5 x 2
##   grupo proporcion_nivel_estudio_7
##   <fct>                      <dbl>
## 1 2                         0.314 
## 2 4                         0.244 
## 3 1                         0.109 
## 4 5                         0.0426
## 5 3                         0.0180

Obteniendo de esta manera que el patrón analizado anteriormente se puede generalizar a los demás grupos, es decir, el orden de estos grupos coincide con un orden determinado por el poder adquisitivo de los habitantes en cada uno barrios presentes en cada grupo.

Otro aspecto que vale la pena resaltar es que si bien estos mapas no determinan el nivel de ingresos de determinado barrio, se puede notar una separación que denota la proporcionalidad casi directa entre ambas dimensiones. Tomando esto en cuenta, este mapa tambien resalta de manera significativa aquellos barrios que tienen grandes cantidades de hogares de invasión como es el caso del barrio La Iguaná, que es precisamente uno de los barrios que quedó dentro del grupo 3, catalogado como uno de los grupos con menos estudios universitarios. Esto denota que la segregación social se expresa de manera directa en los indices de educación de la población.

Para finalizar con una comparativa basada en estudios, observemos un mapa realizado por la Alcaldía de Medellín en el año 2011 que muestra el indice de desarrollo humano.

Indice de desarrollo humano (2011) - Tomado de Medellín en Cifras N°3 (Las metas del desarrollo)

Indice de desarrollo humano (2011) - Tomado de Medellín en Cifras N°3 (Las metas del desarrollo)

Al comparar ambos mapas se nota en gran medida la similaridad de los territorios separados, pues se muestra que el índice de desarrollo humano se da en mayor medida para las zonas que resultaron ser más favorecidas durante el presente análisis en términos de la educación. Esto nos permite concluir que la educación es un factor bastante influyente en el desarrollo social y económico de los habitantes de la ciudad, por tanto la formulación de políticas que permita a los barrios marginales a acceder a la educación superior, ayudara a mejorar las demás dimensiones sociales dentro de la ciudad.

Agrupamiento Jerárquico

A continuación realizaremos el agrupamiento jerárquico con el fin de comparar los resultados arrojados por ambos algoritmos

Se realizará el algoritmo de agrupamiento con 7 grupos, como se muestra en el siguiente código:

cantidad_grupos_jerarquico <- 7

distancia <- dist(datos_agrupamiento)
agrupamiento <- hclust(distancia, method = "complete")
arbol_corte <- cutree(agrupamiento, k = cantidad_grupos_jerarquico)

Mapa geográfico usando el agrupamiento (Agrupamiento Jerárquico)

El mapa resultante del agrupamiento jerárquico se muestra en la siguiente gráfica:

political <- shapefile("Barrio_Vereda/Barrio_Vereda.shp")
Encoding(political@data$NOMBRE) <- "UTF-8"
political$NOMBRE <- political$NOMBRE %>% toupper() %>% str_replace("DE  MESA", "DE MESA")

grupos_barrios <- data.frame(barrio_nombre = db_escolaridad$encuesta_calidad.barrio, comuna_nombre = db_escolaridad$encuesta_calidad.comuna, grupo = arbol_corte)
nombres_mapa <- data.frame(nombre_barrio = political$NOMBRE)

vector_nombres = c()
vector_grupos = c()

for(nombre_mapa in nombres_mapa$nombre_barrio) {
  grupo <- grupos_barrios[grupos_barrios$barrio_nombre == nombre_mapa, 3][1]
  vector_nombres <- c(vector_nombres, nombre_mapa)
  vector_grupos <- c(vector_grupos, grupo)
}

mapa_grupos <- data.frame(
  nombre_barrio = vector_nombres, 
  grupo = vector_grupos
)

factpal <- colorFactor(rainbow(cantidad_grupos_jerarquico), mapa_grupos$grupo)

leaflet(data = political) %>% 
  addTiles() %>% 
  addProviderTiles(providers$OpenStreetMap) %>% 
  addPolygons(fill = TRUE, stroke = TRUE, weight = 2, color = ~factpal(mapa_grupos$grupo), 
              label = as.character(paste(political$NOMBRE, " - Grupo ", mapa_grupos$grupo)),
              popup = as.character(paste(political$NOMBRE, " - Grupo ", mapa_grupos$grupo))) %>% 
  addLegend("bottomright", colors = "#03F", labels = "Barrios y veredas")

Desde un punto de vista general, el agrupamietno jeráriquico muestra un comportamiento muy similar al que se obtuvo mediante el algoritmo K-Means, pues podemos ver que la zona que comprende los barrios aledaños al Poblado pertenece a un mismo grupo, mientras que las zonas correspondientes a barrios con oportunidades económicas bajas quedo en otro grupo. Además los grupos con una calidad educativa intermedia, como lo son los barrios aledaños a La Castellana, Laureles, La Loma de los Bernal y Buenos Aires, quedaron en un mismo grupo.

Comparando ambos algoritmos, podemos notar que K-means ofrece una separación con más información, es decir, si observamos el agrupamiento producido por el algoritmo de agrupamiento jerárquico, se puede notar que los barrios correspondientes a la zona de Aranjuez y Manrique quedaron en un mismo grupo, mientras que con el algoritmo K-means se logra diferenciar dos grupos para esta ubicación geográfica.

Observando a grandes razgos, el patrón es el mismo y las conclusiones que se pueden extraer de este mapa siguen la misma idea de K-means. Sin embargo hay una diferencia entre los dos agrupamientos. Analicemos los grupos para este algoritmo haciendo uso de una variable diferenciadora como la proporcion de personas cuyo último estudio fue de carácter universitario

db_escolaridad_jerarquico <- db_escolaridad %>% mutate(
  grupo = factor(arbol_corte))

medias_grupo_jerarquico <- db_escolaridad_jerarquico %>% dplyr::select(-n, -encuesta_calidad.barrio, -encuesta_calidad.comuna) %>% 
  group_by(grupo) %>% 
  summarize_all(~mean(.))

ggplot(data = medias_grupo_jerarquico) +
  geom_bar(mapping = aes(x = grupo, weight = proporcion_nivel_estudio_7))

grupo_mayor_universitarios_kmeans <- medias_grupo_jerarquico[which(medias_grupo_jerarquico$proporcion_nivel_estudio_7 == max(medias_grupo_jerarquico$proporcion_nivel_estudio_7)), "grupo"]$grupo

Note que al se ha obtenido un comportamiento un poco contrario en cuanto a la diferenciación de los grupos para cada uno de los algoritmos. En el caso de K-means, se obtiene una mayor capacidad para diferenciar barrios cuyo nivel de escolaridad no es alto, como en el caso de los barrios cercanos a Manrique. Mientras que por otro lado, el algoritmo de agrupamiento jerárquico ofrece mayor diferenciabilidad para aquellos barrios que tienen altos ingresos economicos y por tanto un mejor acceso a educación como es en el caso de la diferenciación entre el grupo de los barrios aledaños al Poblado con respecto a barrios como Altos del Poblado y Lalinde.

En este caso, el grupo con mayor proporción de personas con estudios universitarios como último nivel de estudio (grupo 4es el que corresponde a los siguientes barrios:

db_escolaridad_jerarquico[which(db_escolaridad_jerarquico$grupo == grupo_mayor_universitarios_kmeans), "encuesta_calidad.barrio"] %>% as.list()
## $encuesta_calidad.barrio
## [1] "ALTOS DEL POBLADO" "LALINDE"

Esto muestra que en el sector del Poblado aun puede haber una diferenciación entre los barrios, mucho más detallada de lo que puede encontrarse con el algoritmo K-means.